package com.example.cli;

import com.example.dao.UserDao;
import com.example.dao.UserDaoImpl;
import com.example.model.User;
import com.example.service.AuthService;

import java.util.Arrays;
import java.util.Scanner;

/**
 * AuthService命令行工具
 * 提供类似git或docker的命令行接口
 * 
 * 使用示例：
 * auth login username password
 * auth register username password email
 * auth info username
 * auth password username oldPassword newPassword
 * auth list
 * auth help
 * 
 * 交互式模式：
 * 直接运行程序进入交互式模式，持续等待用户输入
 */
public class AuthCLI {

    private static final AuthService authService;
    private static final Scanner scanner = new Scanner(System.in);

    static {
        // 初始化AuthService
        UserDao userDao = new UserDaoImpl();
        authService = new AuthService(userDao);
    }

    public static void main(String[] args) {
        if (args.length == 0) {
            // 进入交互式模式
            runInteractiveMode();
        } else {
            // 命令行模式
            runCommandLineMode(args);
        }
    }

    /**
     * 交互式模式：持续等待用户输入命令
     */
    private static void runInteractiveMode() {
        System.out.println("=== AuthService 交互式命令行工具 ===");
        System.out.println("输入 'help' 查看可用命令，输入 'exit' 或 'quit' 退出程序");
        System.out.println();

        while (true) {
            try {
                System.out.print("auth> ");
                String input = scanner.nextLine().trim();

                if (input.isEmpty()) {
                    continue;
                }

                // 检查退出命令
                if (input.equalsIgnoreCase("exit") || input.equalsIgnoreCase("quit")) {
                    System.out.println("再见！");
                    break;
                }

                // 解析命令
                String[] args = input.split("\\s+");
                processCommand(args);

            } catch (Exception e) {
                System.err.println("错误: " + e.getMessage());
            }
        }

        scanner.close();
    }

    /**
     * 命令行模式：处理命令行参数
     */
    private static void runCommandLineMode(String[] args) {
        try {
            processCommand(args);
        } catch (Exception e) {
            System.err.println("错误: " + e.getMessage());
            System.exit(1);
        }
    }

    /**
     * 处理命令（交互式和命令行模式共用）
     */
    private static void processCommand(String[] args) {
        if (args.length == 0) {
            showHelp();
            return;
        }

        String command = args[0].toLowerCase();

        switch (command) {
            case "login":
                handleLogin(args);
                break;
            case "register":
                handleRegister(args);
                break;
            case "info":
                handleGetUserInfo(args);
                break;
            case "password":
                handleUpdatePassword(args);
                break;
            case "list":
                handleListUsers(args);
                break;
            case "help":
            case "--help":
            case "-h":
                showHelp();
                break;
            case "version":
            case "--version":
            case "-v":
                showVersion();
                break;
            case "exit":
            case "quit":
                System.out.println("再见！");
                System.exit(0);
                break;
            default:
                System.err.println("错误: 未知命令 '" + command + "'");
                System.err.println("使用 'help' 查看可用命令");
                if (args.length == 1) {
                    // 交互式模式下不退出程序
                    return;
                } else {
                    System.exit(1);
                }
        }
    }

    /**
     * 处理登录命令
     * 用法: auth login <username> <password>
     */
    private static void handleLogin(String[] args) {
        if (args.length != 3) {
            System.err.println("用法: login <username> <password>");
            return;
        }

        String username = args[1];
        String password = args[2];

        System.out.println("正在验证用户 '" + username + "'...");

        if (authService.authenticate(username, password)) {
            System.out.println("✓ 登录成功！欢迎回来，" + username);
        } else {
            System.err.println("✗ 登录失败：用户名或密码错误");
        }
    }

    /**
     * 处理注册命令
     * 用法: auth register <username> <password> <email>
     */
    private static void handleRegister(String[] args) {
        if (args.length != 4) {
            System.err.println("用法: register <username> <password> <email>");
            return;
        }

        String username = args[1];
        String password = args[2];
        String email = args[3];

        System.out.println("正在注册用户 '" + username + "'...");

        if (authService.register(username, password, email)) {
            System.out.println("✓ 注册成功！用户 '" + username + "' 已创建");
        } else {
            System.err.println("✗ 注册失败：用户名可能已存在或参数无效");
        }
    }

    /**
     * 处理获取用户信息命令
     * 用法: auth info <username>
     */
    private static void handleGetUserInfo(String[] args) {
        if (args.length != 2) {
            System.err.println("用法: info <username>");
            return;
        }

        String username = args[1];
        System.out.println("正在获取用户 '" + username + "' 的信息...");

        User user = authService.getUserInfo(username);

        if (user != null) {
            System.out.println("用户信息:");
            System.out.println("  ID: " + user.getId());
            System.out.println("  用户名: " + user.getUsername());
            System.out.println("  邮箱: " + user.getEmail());
        } else {
            System.err.println("✗ 用户 '" + username + "' 不存在");
        }
    }

    /**
     * 处理更新密码命令
     * 用法: auth password <username> <oldPassword> <newPassword>
     */
    private static void handleUpdatePassword(String[] args) {
        if (args.length != 4) {
            System.err.println("用法: password <username> <oldPassword> <newPassword>");
            return;
        }

        String username = args[1];
        String oldPassword = args[2];
        String newPassword = args[3];

        System.out.println("正在更新用户 '" + username + "' 的密码...");

        if (authService.updatePassword(username, oldPassword, newPassword)) {
            System.out.println("✓ 密码更新成功！");
        } else {
            System.err.println("✗ 密码更新失败：用户名或旧密码错误");
        }
    }

    /**
     * 处理列出所有用户命令
     * 用法: auth list
     */
    private static void handleListUsers(String[] args) {
        if (args.length != 1) {
            System.err.println("用法: list");
            return;
        }

        System.out.println("正在获取所有用户列表...");

        // 这里需要扩展UserDao来支持获取所有用户
        // 暂时显示一个提示信息
        System.out.println("功能开发中...");
        System.out.println("请使用 'info <username>' 查看特定用户信息");
    }

    /**
     * 显示帮助信息
     */
    private static void showHelp() {
        System.out.println("AuthService 命令行工具");
        System.out.println();
        System.out.println("用法:");
        System.out.println("  auth <command> [options]          # 命令行模式");
        System.out.println("  java -jar auth-cli.jar            # 交互式模式");
        System.out.println();
        System.out.println("命令:");
        System.out.println("  login <username> <password>       用户登录");
        System.out.println("  register <username> <password> <email>  用户注册");
        System.out.println("  info <username>                   获取用户信息");
        System.out.println("  password <username> <old> <new>   更新用户密码");
        System.out.println("  list                              列出所有用户");
        System.out.println("  help                              显示此帮助信息");
        System.out.println("  version                           显示版本信息");
        System.out.println("  exit/quit                         退出程序（仅交互式模式）");
        System.out.println();
        System.out.println("示例:");
        System.out.println("  login alice 123456");
        System.out.println("  register bob password123 bob@example.com");
        System.out.println("  info alice");
        System.out.println("  password alice 123456 newpassword");
        System.out.println();
        System.out.println("交互式模式:");
        System.out.println("  直接运行程序进入交互式模式");
        System.out.println("  输入命令后按回车执行");
        System.out.println("  输入 'exit' 或 'quit' 退出程序");
    }

    /**
     * 显示版本信息
     */
    private static void showVersion() {
        System.out.println("AuthService CLI v1.0.0");
        System.out.println("基于 JDBC + Mockito 演示项目");
        System.out.println("作者: 初级人员孵化项目");
    }
}